using UnityEngine;
using QFramework;
using QFramework.Example;
using JetBrains.Annotations;

namespace ProjectSurvivor
{
	public partial class CameraController : ViewController
	{
		public Vector2 mTargetPosition = Vector2.zero;//// 目标位置（玩家位置）
		private static CameraController mDefault = null;//// 默认的相机控制器实例
		public static Transform LBTrans=>mDefault.LB;
		public static  Transform RTTrans=>mDefault.RT;
		void Awake()
		{
			mDefault = this;
		}
		void OnDestroy()
		{
			mDefault = null;
		}
		void Start()
		{
			Application.targetFrameRate = 60;//// 设置目标帧率为60
		}
		private Vector3 mCurrentCameraPos;// 当前相机位置
		private bool mShake = false;// 是否启用震动效果
		private int mShakeFrame = 0;//震动帧数
		private float mShakeA = 0.5f;//震动的振幅
		/// <summary>
		/// Shake() 静态方法
		/// </summary>
		public static void Shake()
		{
			mDefault.mShake = true;// 启用震动效果
			mDefault.mShakeFrame = 30;// 设置震动持续时间（30帧）
			mDefault.mShakeA = 0.2f;// 设置震动振幅
		}


		void Update()
		{
			if (Player.Default)
			{
				mTargetPosition =Player.Default.transform.position;
				// 平滑跟随相机：x 轴  根据时间的推移使相机的位置逐渐逼近目标位置，产生一种平滑的跟随效果
				mCurrentCameraPos.x =
	//Mathf.Exp 是计算自然对数 e 的幂的函数，用于计算一个数的对数值，然后再次取自然对数，得到一个平滑的曲线。
					(1.0f - Mathf.Exp(-Time.deltaTime * 20))
				.Lerp(transform.position.x, mTargetPosition.x);
				// 平滑跟随相机：y 轴  平滑插值公式
				mCurrentCameraPos.y =
					(1.0f - Mathf.Exp(-Time.deltaTime * 20)).
					Lerp(transform.position.y, mTargetPosition.y);
				// 保持 z 轴不变（保持相机高度）
				mCurrentCameraPos.z = transform.position.z;
				if (mShake)
				{
					// 震动帧数递减
					mShakeFrame--;
					// 计算震动的强度
					var shakeA = Mathf.Lerp(mShakeA, 0.0f, mShakeFrame / 30.0f);
					// 修改相机位置，产生震动效果
					transform.position = new Vector3(mCurrentCameraPos.x + Random.Range(-shakeA, shakeA),
					mCurrentCameraPos.y + Random.Range(-shakeA, shakeA), mCurrentCameraPos.z);

					// 如果震动持续的帧数结束，停止震动
					if (mShakeFrame <= 0)
					{
						mShake = false;
					}
				}
				else
				{
					//如果没有震动，平滑移动相机到目标位置
					transform.PositionX(
						//计算平滑因子，用于控制相机位置的平滑程度，越大越平滑
						//1-的话是0-1，不1-是1-0
						//整段话，使用负号，0-1，不使用0到负无穷
						//后面小段话对应帧数越大，平滑程度越高,使用负号1-0，不使用1-...
						(1.0f - Mathf.Exp(-Time.deltaTime * 20))
					.Lerp(transform.position.x, mTargetPosition.x));
					transform.PositionY(
						(1.0f - Mathf.Exp(-Time.deltaTime * 20)).
						Lerp(transform.position.y, mTargetPosition.y));
				}


			}
		}
	}
}
